perm filename UDPDIR.FAI[KID,KMC] blob sn#122896 filedate 1974-11-15 generic text, type T, neo UTF8
TITLE UDPDIR	;THIS PROG PUTS THE KMC-UDP DIRECTORY IN READABLE FORM.

A←1
B←2
C←3
P←7
CNT←10
PNT←11

UDPCHN←←1
LPTCHN←←2
PAKST←←1		;FIRST BLOCK OF KIDS AREA
PDL:	BLOCK	=10

START:	;START BY INIT-ING THE DEVICES.
	INIT	UDPCHN,17	;DUMP MODE OF COURSE
	SIXBIT	/UDP/
	0
	JRST	[OUTSTR [ASCIZ /CANNOT INIT UDP/]
		 CALL [SIXBIT /EXIT/]]

	INIT	LPTCHN,0	;CHARACTER PUSHING MODE.
	SIXBIT	/LPT/
	XWD	OBUF,0
	JRST	[OUTSTR	[ASCIZ /CANNOT INIT LPT/]
		 HALT]

	MOVE	P,[IOWD 7,PDL]

	;NOW READ THE UDP DIRECTORY BLOCK.
	IN	UDPCHN,[IOWD =2336,DIRECT
			PAKST]
	JRST	.+2
	JRST	[OUTSTR [ASCIZ /ERROR ON UDP READ/]
		 CALL [SIXBIT /EXIT/]]

	;CHECK THAT WORDS 0 AND 2 (NO. OF ENTRIES AND NEXT FREE BLOCK)
	;ARE REASONABLE NONNEGATIVE NUMBERS.
	MOVE	A,DIRECT
	JUMPL	A,[OUTSTR [ASCIZ /NEGATIVE NO. OF ENTRIES/]
		   HALT]
	CAILE	A,=1164		;NO MORE THAN 1164 DIRECTORY ENTRIES
	JRST	[OUTSTR	[ASCIZ /NUMBER OF ENTRIES TOO LARGE/]
		 HALT]
	MOVE	A,DIRECT+2
	JUMPL	A,[OUTSTR [ASCIZ /WORD 2 IS NEGATIVE/]
		   HALT]
	CAILE	A,=4000		;TEST IF IMPOSSIBLE BLOCK NO.
	JRST	[OUTSTR [ASCIZ /WORD 2 TOO LARGE/]
		 HALT]

	;NEXT PRINT THE DIRECTORY HEADING.
	PUSHJ	P,HEAD		;DO IT.

	;NOW LOOP THE NUMBER OF TIMES GIVEN BY [DIRECT]
	MOVE	CNT,DIRECT	;LOOP COUNT.
	MOVEI	PNT,4		;ADDRESS OF FIRST ENTRY
LOOP:	JUMPE	CNT,LOOPX	;GET OUT WHEN COUNT=0
	MOVE	B,DIRECT
	SUB	B,CNT		;GET FILE NUMBER.
	IDIVI	B,=40		;WANT 40 LINES PER PAGE
	SUBI	C,=39		;WANT TO DETECT EVERY 40TH LINE.
	JUMPN	C,.+4
	MOVEI	B,014		;FORM FEED CHAR.
	PUSHJ	P,PUTCHR	;O/P IT
	PUSHJ	P,HEAD		;PAGE HEADING
	MOVEI	A,7
	PUSHJ	P,TAB
	MOVE	A,DIRECT
	SUB	A,CNT		;GET FILE NUMBER.
	PUSHJ	P,INTGER	;PRINT FILE NUMBER
	MOVEI	A,=19
	PUSHJ	P,TAB
	MOVE	A,DIRECT(PNT)
	PUSHJ	P,SIXSTR	;PRINT FILE NAME
	MOVEI	A,=38
	PUSHJ	P,TAB
	HRRZ	A,DIRECT+1(PNT)	;BLOCK NUMBER
	PUSHJ	P,INTGER	;PRINT IT
	MOVEI	A,=58
	PUSHJ	P,TAB
	HLRZ	A,DIRECT+1(PNT)	;FILE LENGTH
	PUSHJ	P,INTGER	;PRINT IT
	PUSHJ	P,NEWLN
	SUBI	CNT,1		;BUMP COUNT
	ADDI	PNT,2		;BUMP POINTER.
	JRST	LOOP

LOOPX:	;THE INFO FOR THE CURRENT ENTRY IS OUT.
	PUSHJ	P,NEWLN
	MOVEI	A,[ASCIZ /END OF DIRECTORY - /]
	PUSHJ	P,TEXT
	MOVEI	A,[ASCIZ /NUMBER OF FREE BLOCKS = /]
	PUSHJ	P,TEXT
	MOVEI	A,=4000
	SUB	A,DIRECT+2
	PUSHJ	P,INTGER
	PUSHJ	P,NEWLN


	RELEAS	UDPCHN,0
	RELEAS	LPTCHN,0
	CALL	[SIXBIT /EXIT/]



PUTCHR:	AOS	CHCNT		;ROUTINE TO SHOVE THE CHAR IN B
	SOSG	OBUF+2
	OUT	LPTCHN,
	JRST	PUTCH1
	HALT

PUTCH1:	IDPB	B,OBUF+1
	POPJ	P,

OBUF:	BLOCK	3
CHCNT:	0			;CHARACTER COUNT FOR TAB ROUTINE.


TAB:	;TAB ROUTINE - PUT OUT SPACES UNTIL CHCNT GT AREG
	CAMG	A,CHCNT
	POPJ	P,		;CH COUNT AT LEAST AS LARGE AS [A]
	MOVEI	B,040		;CODE FOR SPACE.
	PUSHJ	P,PUTCHR
	JRST	TAB


INTGER:	;ROUTINE TO SHOVE THE INTEGER IN A.
	MOVE	B,A		;USEFUL HERE
	JUMPL	B,NPN		;BALK AT NEGATIVE NUMBERS.
	CAIL	B,=1000000
	JRST	NPN
	CAIL	B,=100000
	JRST	INT1
	CAIL	B,=10000
	JRST	INT2
	CAIL	B,=1000
	JRST	INT3
	CAIL	B,=100
	JRST	INT4
	JRST	INT5
INT1:	IDIVI	B,=100000
	PUSHJ	P,INT9
INT2:	IDIVI	B,=10000
	PUSHJ	P,INT9
INT3:	IDIVI	B,=1000
	PUSHJ	P,INT9
INT4:	IDIVI	B,=100
	PUSHJ	P,INT9
INT5:	IDIVI	B,=10
	PUSHJ	P,INT9
INT6:	IDIVI	B,=1
	PUSHJ	P,INT9
	POPJ	P,

INT9:	ADDI	B,060		;RECODE SO DIGITS ARE DIGITS.
	PUSHJ	P,PUTCHR
	MOVE	B,C
	POPJ	P,

NPN:	;NON PRINTABLE INTEGER.
	MOVEI	A,[ASCIZ /******/]
	JRST	TEXT


NEWLN:	MOVEI	B,015
	PUSHJ	P,PUTCHR
	MOVEI	B,012
	PUSHJ	P,PUTCHR
	SETZM	CHCNT
	POPJ	P,


TEXT:	;OUTPUT THE ASCIZ STRING POINTED TO BY REG A.
	HLL	A,[POINT =7,0]
TEX1:	ILDB	B,A
	JUMPE	B,TEX2		;ESCAPE LOOP WHEN ZERO BYTE COMES ALONG
	PUSHJ	P,PUTCHR
	JRST	TEX1
TEX2:	POPJ	P,


SIXSTR:	;OUTPUT A WORD OF SIXBIT CHARACTERS
	MOVEM	A,SIXTMP
	MOVE	A,[POINT 6,SIXTMP]
SIX1:	ILDB	B,A
	JUMPE	B,SIX2		;ESCAPE LOOP AT SPACE CHAR
	ADDI	B,040		;GET ASCII VERSION
	PUSHJ	P,PUTCHR
	JRST	SIX1
SIX2:	POPJ	P,
SIXTMP:	0
	0


DATE:	;THE CONTENTS OF REGISTER A IS A DATE IN PDP10 FORM
	;OUTPUT IT IN READABLE FORM.
	IDIVI	A,=31
	ADDI	B,1
	MOVEM	B,DAY		;THE DAY OF THE MONTH
	IDIVI	A,=12
	MOVEM	B,MONTH		;THE MONTH NUMBER - 1
	ADDI	A,=64		;THE YEAR NUMBER.
	MOVEM	A,YEAR

	MOVE	A,MONTH
	MOVE	A,MTHNAM(A)	;MONTH NAME
	PUSHJ	P,SIXSTR
	MOVEI	B,055		;MINUS SIGN
	PUSHJ	P,PUTCHR
	MOVE	A,DAY
	PUSHJ	P,INTGER
	MOVEI	B,055		;MINUS SIGN
	PUSHJ	P,PUTCHR
	MOVE	A,YEAR
	PUSHJ	P,INTGER
	POPJ	P,		;DECLARE VICTORY AND GET OUT


MONTH:	0
DAY:	0
YEAR:	0
MTHNAM:	SIXBIT	/JAN/
	SIXBIT	/FEB/
	SIXBIT	/MAR/
	SIXBIT	/APR/
	SIXBIT	/MAY/
	SIXBIT	/JUN/
	SIXBIT	/JUL/
	SIXBIT	/AUG/
	SIXBIT	/SEP/
	SIXBIT	/OCT/
	SIXBIT	/NOV/
	SIXBIT	/DEC/



HEAD:	;ROUTINE TO WRITE A PAGE HEADING
	PUSHJ	P,NEWLN		;CRLF
	MOVEI	A,[ASCIZ /UDP DIRECTORY             /]
	PUSHJ	P,TEXT
	PUSHJ	P,NEWLN
	MOVEI	A,[ASCIZ /THE DATE TODAY IS (/]
	PUSHJ	P,TEXT
	CALL	A,[SIXBIT /DATE/]
	PUSHJ	P,DATE
	MOVEI	A,[ASCIZ /)     AND THE DATE ON THE UDP IS (/]
	PUSHJ	P,TEXT
	MOVE	A,DIRECT+1
	PUSHJ	P,DATE
	MOVEI	A,[ASCIZ /)/]
	PUSHJ	P,TEXT
	PUSHJ	P,NEWLN
	PUSHJ	P,NEWLN
	MOVEI	A,[ASCIZ /  FILE NUMBER    FIL/]
	PUSHJ	P,TEXT
	MOVEI	A,[ASCIZ /E NAME       ADDRESS/]
	PUSHJ	P,TEXT
	MOVEI	A,[ASCIZ / OF THE        FILE /]
	PUSHJ	P,TEXT
	MOVEI	A,[ASCIZ /LENGTH              /]
	PUSHJ	P,TEXT
	PUSHJ	P,NEWLN
	MOVEI	A,[ASCIZ /                    /]
	PUSHJ	P,TEXT
	MOVEI	A,[ASCIZ /               FIRST/]
	PUSHJ	P,TEXT
	MOVEI	A,[ASCIZ / BLOCK           (WO/]
	PUSHJ	P,TEXT
	MOVEI	A,[ASCIZ /RDS)                /]
	PUSHJ	P,TEXT
	PUSHJ	P,NEWLN
	PUSHJ	P,NEWLN
	POPJ	P,


DIRECT:	BLOCK	=2338		;SPACE FOR 1 UDP BLOCK + 2WDS.

END START